#ifndef __EPD_IO_H__
#define __EPD_IO_H__

#include <stdint.h>
#include <stdio.h>
#include "epd_types.h"

typedef enum epd_pin_e {
    EPD_PIN_RST,     // 复位引脚
    EPD_PIN_DC,      // 数据/命令选择引脚
    EPD_PIN_PWR,     // 电源控制引脚
    EPD_PIN_CS,      // 片选引脚
    EPD_PIN_BUSY,    // 忙状态引脚
    EPD_PIN_MOSI,    // 主输出从输入引脚
    EPD_PIN_SCK      // 时钟引脚
} epd_pin_t;

typedef enum epd_gpio_level_e {
    EPD_GPIO_LOW = 0,  // GPIO低电平
    EPD_GPIO_HIGH = 1, // GPIO高电平
} epd_gpio_level_t;

// 临界区接口
void epd_enter_critical(void);
void epd_exit_critical(void);

#define EPD_CRITICAL_SECTION(yourcode) \
    do {                               \
        epd_enter_critical();          \
        { yourcode }                   \
        epd_exit_critical();           \
    } while(0)

// 日志打印宏
#define epd_printf(__info,...) printf("[EPD]: "__info,##__VA_ARGS__)

// EPD相关引脚初始化
void epd_io_init(void);

// SPI接口
void epd_spi_write_byte(uint8_t data);
void epd_spi_write_buffer(const uint8_t *data, uint32_t len);
uint8_t epd_spi_read_byte(void);

// GPIO控制
void epd_pin_write(epd_pin_t pin, epd_gpio_level_t value);
epd_gpio_level_t epd_pin_read(epd_pin_t pin);

// 延时接口
void epd_delay_ms(uint16_t ms);

#endif // __EPD_IO_H__
